#!/usr/bin/perl

# fonctions utiles:
# length($chaine)
# substr($chaine, $offset, $taille)
# opendir et readdir
# utilise des classes de caractères unicode dans les expressions régulières
# \p{nom} avec comme valeur possible pour nom: IsBlank, IsSpace, IsPunct...

use locale;
use strict;

use open":utf8";

# my $rep="debian";

my @fichiers;

my ($fch, $langue, $forme, @mots, $mot, $i);
my ($option, $modele, $rep, $fch, $ligne, $nbOccs);
my ($seuil, $longueur, $nGramme, $prefixe, $sub_str);
#  $seuil_n
my (%formes, %cpt_formes, %nGram, %cpt_nGram);
my (%nGrammes_dmd, %proba_formes, %proba_nGram);

#  %p = ( "IsEnter" => "\\n",
# 	  "IsSpace" => "\\s",
# 	  "IsReturn" => "\\r",
# 	  "IsTab" => "\\t",
# 	);

$seuil = 1;
$longueur = 50;
#$nGramme = 1;
$prefixe = "appr";

if (@ARGV<2)
	{ die("utilisation : ./apprentissage.pl [-seuil=<valeur>] [-longueur=<valeur>] [-<N>grams=<seuil>] <rep_src> <prefixe_modeles>"); }
else {
	for($i=0; $i<$#ARGV-1; $i++) {
		$option = @ARGV[$i];
		if($option =~ /^-seuil=(\d+)$/) {
			$seuil = $1;
		}

		if($option =~ /^-longueur=(\d+)$/) {
			$longueur = $1;
		}

		if($option =~ /^-(\d+)grams=(\d+)$/) {
			#$nGramme = $1;
			#if(defined $2) {$seuil_n = $2;}
			#else {$seuil_n = 1;}
			if(defined $2) {$nGrammes_dmd{$1} = $2;}
			else {$nGrammes_dmd{$1} = 1;}
		}
	}
}

$rep = @ARGV[$#ARGV-1];
$prefixe = @ARGV[$#ARGV];

opendir(REPERTOIRE, "$rep")
	|| die "Can't open directory $rep!\n";

@fichiers = readdir REPERTOIRE;
# $nb_fch = @fichiers;

closedir(REPERTOIRE);

foreach $fch (@fichiers) {

 	if($fch =~ /(\w+)[_](\w+)[.](\w+)$/) {
		$langue = $3;
		#print "$langue\n";
	
		open(FILE, "$rep/$fch")
			|| die "Can't open file $rep/$fch!\n";
		
		while($ligne=<FILE>) {
			@mots = split(/[^\w]|\p{IsBlank}|\p{IsSpace}|\p{IsPunct}/,$ligne);
			
			
			foreach $mot (@mots) {
				if(length($mot)<$longueur) {
					if(exists($formes{$mot})) {
						if(exists($formes{$mot}{$langue})) {
							$formes{$mot}{$langue}++;
						}
						else {
							$formes{$mot}{$langue} = 1;
						}
					}
					else {
						$formes{$mot}{$langue} = 1;
					}
					
					#Comptage du nombre total des formes
					if(exists($cpt_formes{$mot})) {
						$cpt_formes{$mot}++;
					}
					else {
						$cpt_formes{$mot} = 1;
					}
					
					
					# Nb d'occurrences des formes
					# print "$formes{$mot}{$langue}\n";
				}
			}			
		}	
		close(FILE);		
	}
}

# n-grammes
foreach $mot (keys %formes) {
	foreach $langue (keys %{$formes{$mot}}) {
	
		$nbOccs = $formes{$mot}{$langue};
		
		foreach $nGramme (keys %nGrammes_dmd) {
			for($i=0; $i<length($mot)-$nGramme; $i++) {
			
				$sub_str = substr($mot, $i, $nGramme);
				
				if(exists($nGram{$nGramme}{$sub_str}{$langue})) {
					$nGram{$nGramme}{$sub_str}{$langue} += $nbOccs;
				}
				else {
					$nGram{$nGramme}{$sub_str}{$langue} = $nbOccs;
				}
				
				if(exists $cpt_nGram{$nGramme}{$sub_str}) {
					$cpt_nGram{$nGramme}{$sub_str} += $nbOccs;
				}
				else {
					$cpt_nGram{$nGramme}{$sub_str} = $nbOccs;
				}
			}
		}
	}
}

# Calcul de probabilité
foreach $mot (keys %formes) {
	foreach $langue (keys %{$formes{$mot}}) {
		$proba_formes{$mot}{$langue} = $formes{$mot}{$langue} / $cpt_formes{$mot};
	}
} 

foreach $nGramme (keys %nGram) {
	foreach $sub_str (keys %{$nGram{$nGramme}}) {
		foreach $langue (keys %{$nGram{$nGramme}{$sub_str}}) {
			$proba_nGram{$nGramme}{$sub_str}{$langue} = $nGram{$nGramme}{$sub_str}{$langue} / $cpt_nGram{$nGramme}{$sub_str};
		}
	}
}

# Ecriture du fichier de sortie des formes
$fch = "./modeles/".$prefixe.".formes";
open(SORTIE, ">$fch")
				|| die "Can't open file $fch!\n";
				
	foreach $mot (sort keys %proba_formes) {
	
		print SORTIE "$mot";

		foreach $langue (sort { $proba_formes{$mot}{$b} <=> $proba_formes{$mot}{$a} } keys %{$proba_formes{$mot}}) {
			print SORTIE "\t$langue=".$proba_formes{$mot}{$langue};
		}
		print SORTIE "\n";
	}
	
close(SORTIE);

# Ecriture du fichier de sortie des n-grammes

foreach $nGramme (keys %nGrammes_dmd) {
	$fch = "./modeles/".$prefixe.".".$nGramme."grams";
	open(SORTIE, ">$fch")
					|| die "Can't open file $fch!\n";
					
		foreach $sub_str (sort keys %{$proba_nGram{$nGramme}}) {
		
			print SORTIE "$sub_str";

			foreach $langue (sort { $proba_nGram{$nGramme}{$sub_str}{$b} <=> $proba_nGram{$nGramme}{$sub_str}{$a} } keys %{$proba_nGram{$nGramme}{$sub_str}}) {
				print SORTIE "\t$langue=".$proba_nGram{$nGramme}{$sub_str}{$langue};
			}
			print SORTIE "\n";
		}
		
	close(SORTIE);
}
